/**
 *  Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * @author <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a>
 * Creaci&oacute;n: 11-nov-2005 - 17:10:39
 * Cambios :
 *  Autor  |  Cambios
 *
 */

package com.psiqueware.alheli.logging.log4j;

import com.psiqueware.alheli.basico.BaseObject;
import org.apache.log4j.spi.LoggingEvent;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * Representaci&oacute;n primitiva de un LogMessage de Log4j
 * <br/>Paquete Original: com.psiqueware.basico.logging
 * <br/>Nombre  Original: LogMessage
 * <br/><a href="LogMessage.java.html"><i>Ver Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a>
 * @version Revision: 1.1 11-nov-2005 17:10:39
 * @noinspection ClassWithoutNoArgConstructor, ClassWithoutLogger, ClassWithoutToString, ClassWithTooManyFields, ClassWithTooManyMethods
 */
public final class LogMessage extends BaseObject
{


    /**
     * Devuelve la prioridad del evento
     */
    private int m_nivel;

    /**
     * Nombre de la clase
     */
    private String m_clase;

    /**
     * Nombre del archivo que contiene la clase
     */
    private String m_archivo;

    /**
     * N&uacute;mero de linea del LogMessage
     */
    private String m_numeroLinea;

    /**
     * Nombre del M&eacute;todo que dispar&oacute; el m_log
     */
    private String m_metodo;

    /**
     * Devuelve el nombre del Logger.
     */
    private String m_logger;

    /**
     * Mensaje logeado
     */
    private String m_mensaje;

    /**
     * nested diagnostic context
     */

    private String m_ndc;

    /**
     * Thread que envi&oacute; el mensaje
     */
    private String m_thread;

    /**
     * Lista de throwables errores.
     */
    private List<LogThrowable> m_logThrowables = new ArrayList<LogThrowable>();

    /**
     * Fecha de Creaci&oacute;n del mensaje
     */
    private Date m_fecha = new Date();

    /**
     * Constante de longitud del mensaje, se corta a 1024 caracteres.
     * <br/><b>Importate:</b> es necesario que en la base de datos
     * se tengan los 1024 caracteres.
     */
    private static final int LONGITUD_CAMPO_MENSAJE = 1023;

    /**
     * Construye una LogMessage.
     * No requiere argumentos.
     */
    public LogMessage()
    {
        m_metodo = null;
        m_thread = null;
    }

    /**
     * Construye un LogMessage
     *
     * @param loggingEvent evento a logear.
     */
    public LogMessage(LoggingEvent loggingEvent)
    {
        //Devuelve la prioridad del evento
        m_nivel = loggingEvent.getLevel().getSyslogEquivalent();
        //Devuelve la localizaci&oacute;n donde surgi&oacute; el evento.
        m_clase = loggingEvent.getLocationInformation().getClassName();
        m_archivo = loggingEvent.getLocationInformation().getFileName();
        m_numeroLinea = loggingEvent.getLocationInformation().getLineNumber();
        m_metodo = null;
        m_metodo = loggingEvent.getLocationInformation().getMethodName();
        //Devuelve el nombre del Logger.
        m_logger = loggingEvent.getLoggerName();
        //Mensaje logeado
        m_mensaje = loggingEvent.getMessage().toString();
        if (null != m_mensaje)
        {
            m_mensaje = m_mensaje.trim();
            if (m_mensaje.length() > LONGITUD_CAMPO_MENSAJE)
            {
                m_mensaje = m_mensaje.substring(0, LONGITUD_CAMPO_MENSAJE - 1);
            }
        }

        //nested diagnostic context
        m_ndc = loggingEvent.getNDC();
        //Thread que envi&oacute; el mensaje
        m_thread = null;
        m_thread = loggingEvent.getThreadName();
    }

    /**
     * Ordena los mensajes de error de este m_log.
     */
    public void sort()
    {
        if (null != m_logThrowables)
        {
            Collections.sort(m_logThrowables, new LogThrowableComparator());
        }
    }

    /**
     * A&ntilde;ade un mensaje de error a este mensaje.
     *
     * @param logThrowable a a&ntilde;adir.
     *
     * @return boolean verdadero en caso de que no se hubiera a&ntilde;adido este throwable antes a la lista; false en caso contrario.
     */
    public boolean addLogThrowable(LogThrowable logThrowable)
    {
        return m_logThrowables.add(logThrowable);
    }

    /**
     * Devuelve el Devuelve la prioridad del evento
     *
     * @return valor de 'nivel'.
     *
     * @see int
     */
    public int getNivel()
    {
        return m_nivel;
    }

    /**
     * Establece el Devuelve la prioridad del evento
     *
     * @param nivel nuevo valor para 'nivel'.
     *
     * @see int
     */
    public void setNivel(int nivel)
    {
        m_nivel = nivel;
    }

    /**
     * Devuelve el Nombre de la clase
     *
     * @return valor de 'clase'.
     *
     * @see String
     */
    public String getClase()
    {
        return m_clase;
    }

    /**
     * Establece el Nombre de la clase
     *
     * @param clase nuevo valor para 'clase'.
     *
     * @see String
     */
    public void setClase(String clase)
    {
        m_clase = clase;
    }

    /**
     * Devuelve el Nombre del archivo que contiene la clase
     *
     * @return valor de 'archivo'.
     *
     * @see String
     */
    public String getArchivo()
    {
        return m_archivo;
    }

    /**
     * Establece el Nombre del archivo que contiene la clase
     *
     * @param archivo nuevo valor para 'archivo'.
     *
     * @see String
     */
    public void setArchivo(String archivo)
    {
        m_archivo = archivo;
    }

    /**
     * Devuelve el N&uacute;mero de linea del LogMessage
     *
     * @return valor de 'numeroLinea'.
     *
     * @see String
     */
    public String getNumeroLinea()
    {
        return m_numeroLinea;
    }

    /**
     * Establece el N&uacute;mero de linea del LogMessage
     *
     * @param numeroLinea nuevo valor para 'numeroLinea'.
     *
     * @see String
     */
    public void setNumeroLinea(String numeroLinea)
    {
        m_numeroLinea = numeroLinea;
    }

    /**
     * Devuelve el Nombre del M&eacute;todo que dispar&oacute; el m_log
     *
     * @return valor de 'metodo'.
     *
     * @see String
     */
    public String getMetodo()
    {
        return m_metodo;
    }

    /**
     * Establece el Nombre del M&eacute;todo que dispar&oacute; el m_log
     *
     * @param metodo nuevo valor para 'metodo'.
     *
     * @see String
     */
    public void setMetodo(String metodo)
    {
        m_metodo = metodo;
    }

    /**
     * Devuelve el Devuelve el nombre del Logger.
     *
     * @return valor de 'logger'.
     *
     * @see String
     */
    public String getLogger()
    {
        return m_logger;
    }

    /**
     * Establece el Devuelve el nombre del Logger.
     *
     * @param logger nuevo valor para 'logger'.
     *
     * @see String
     */
    public void setLogger(String logger)
    {
        m_logger = logger;
    }

    /**
     * Devuelve el Mensaje logeado
     *
     * @return valor de 'mensaje'.
     *
     * @see String
     */
    public String getMensaje()
    {
        return m_mensaje;
    }

    /**
     * Establece el Mensaje logeado
     *
     * @param mensaje nuevo valor para 'mensaje'.
     *
     * @see String
     */
    public void setMensaje(String mensaje)
    {
        m_mensaje = mensaje;
    }

    /**
     * Devuelve el nested diagnostic context
     *
     * @return valor de 'ndc'.
     *
     * @see String
     */
    public String getNdc()
    {
        return m_ndc;
    }

    /**
     * Establece el nested diagnostic context
     *
     * @param ndc nuevo valor para 'ndc'.
     *
     * @see String
     */
    public void setNdc(String ndc)
    {
        m_ndc = ndc;
    }

    /**
     * Devuelve el Thread que envi&oacute; el mensaje
     *
     * @return valor de 'thread'.
     *
     * @see String
     */
    public String getThread()
    {
        return m_thread;
    }

    /**
     * Establece el Thread que envi&oacute; el mensaje
     *
     * @param thread nuevo valor para 'thread'.
     *
     * @see String
     */
    public void setThread(String thread)
    {
        m_thread = thread;
    }


    /**
     * Devuelve el Lista de throwables errores.
     *
     * @return valor de 'logThrowables'.
     *
     * @see List
     */
    public List<LogThrowable> getLogThrowables()
    {
        return m_logThrowables;
    }


    /**
     * Establece el Lista de throwables errores.
     *
     * @param logThrowables nuevo valor para 'logThrowables'.
     *
     * @see List
     */
    public void setLogThrowables(List<LogThrowable> logThrowables)
    {
        this.m_logThrowables = logThrowables;
    }


    /**
     * Devuelve el Fecha de Creaci&oacute;n del mensaje
     *
     * @return valor de 'fecha'.
     *
     * @see Date
     */
    public Date getFecha()
    {
        return m_fecha;
    }


    /**
     * Establece el Fecha de Creaci&oacute;n del mensaje
     *
     * @param fecha nuevo valor para 'fecha'.
     *
     * @see Date
     */
    public void setFecha(Date fecha)
    {
        m_fecha = fecha;
    }
}
